/* -----------------------------------------------------------------------
 *   Copyright (C) 2008 by Denjs
 *   dplsoft@pisem.net
 *   http://qdroid.berlios.de
 * -----------------------------------------------------------------------
 *   This program is free software licensed under GNU GPL License v.2 ; see main.cpp fo details
 *   Эта программа является свободным программным обеспечением; распространяемым под
 *   лицензией GNU General Public License v.2 (УНИВЕРСАЛЬНАЯ ОБЩЕСТВЕННАЯ ЛИЦЕНЗИЯ GNU версия 2.0) 
 * ----------------------------------------------------------------------- 
*/

/*
 * t_BaseBot.h
 *
 *  Created on: 18.11.2008
 *      Author: Denjs
 */

#ifndef T_BASEBOT_H_
#define T_BASEBOT_H_

#include <QApplication>
#include <QMessageBox>
#include <QInputDialog>
#include <QFileDialog>

#include "t_AbstractQDroidBot.h"
// include "./classes/t_QDroid.h"
#include "./classes/t_FunctionRegistryItem.h" //<-- to rename to ScriptFile or else

//as in OTPD) // TODO to delete?
// Linux :
#if defined (Q_WS_X11) 
	/* nothing needs to be included here yet...*/
// Win :
#elif defined (Q_WS_WIN)
	// for Sleep() :
	#include <windows.h>
// Mac:
#elif defined (Q_WS_MAC)
	/* NOT SUPPORTED THIS VERSION */
#else
	/* NOT SUPPORTED THIS VERSION */
#endif


/*
 Базовый бот - предоставляет некоторые общие функции

*/

//class t_BaseBot;
class t_BaseBot : public t_AbstractQDroidBot
{
    Q_OBJECT

    public:
	t_BaseBot(t_FunctionRegistryItem *_FunctionRegItem, QObject *parent =0);
		
	void send_std_out(QString Message); // нужна для переопределения print(). оболочка для std_out для непосредственного вызова из других С++-функций
	bool useGui;//копируется при создании из QdQueen
	QStringList arguments;
	QString platformVersion;

        //QString scriptFilePath;
        QString c_scriptFileName;
        QString c_scriptDirPath;

    public slots:
		QString std_in(QString Message); // needs to be redefined to make real class
		/* никак не связано сейчас со стандартными потоками ввода-вывода*/
		t_BaseBot* copy();//костыли в рузультуате того что регистрируем ссылку а не сам тип для движка

		QString say_hello(); //?test functions

		//QString app_dir(); //returns application directory
		QString temporallyDirPath();//app_dir()
		QString applicationDirPath();//app_dir()
                QString currentPath(); //
                QString scriptDirPath();//
                QString scriptFileName();//current Script file name
                //QString currentScriptPath(); //current Script file name

		//сменить текущий каталог 
		int shell_execute(QString Command); //команда для выполнения в Shell. Предполагается
					//предполагается что будет определять функцию shell();
					// СМОТРИ ТАКЖЕ ОБЪЕКТ qdl_ChildProcess
		//STDIN|STDOUT|STDERR
		//ТЕПЕРЬ В ОТДЕЛЬНОМ ОБЪЕКТЕ
		//это поучатели - два от внутренних объъектов системы, один от "ядра"
//		void rcv_to_std_err(QByteArray Message); //--> к нему подключены сигналы внутренних объектов
//		void rcv_to_std_out(QByteArray Message); //--> к нему подключены сигналы внутренних объектов
//		void rcv_from_std_in(QByteArray Message);// -> к нему подключен SIGNAL QDroid.rsv_from_std_in
		//void openStdReader();// -> запустить обработку потоков ввода
		//void closeStdReader();// -> остановить обработку потоков ввода-вывода
		//void slot_stdInStream_Closed();//получаем инфу  что входной поток закрыт.
		//QByteArray stdin_Read(int maxSize);
		//int stdin_CashSize();		//это функция для доступа из скрипта
		//bool sdtin_waitFirReadyRead(int maxTime);// клон функции) 
		//int SleepMS( unsigned int time);//это функция для доступа из скрипта
		//void slot_stdInSetCachedMode();		//alternative mode
		//void slot_stdInSetDataFlowMode();	//default



//TODO	// проверить чтобы они не пересекались с аналогичными в скрипте
	   //СТРОКИ функции работы со строками, определены здесь
       //СТРОКИ:отсекание и разделение строк
		QString str_mid(QString Source,int StartPos,int EndPos=-1);
		QString str_right(QString Source,int Lenght);
		QString str_left(QString Source,int Lenght);
		//removes last symbols
		QString str_chop(QString Source,int Lenght);
		//get splitted part
		QString str_splitted_part(QString Source,QString Splitter, int PartNomber);
		// на сколько частей можно разрезить эту строку
		int str_splitted_part_couter(QString Source,QString Splitter);
	  //СТРОКИ:поиск и сравнение символов
		bool str_starts_with(QString Source,QString FindStr);
		bool str_ends_with(QString Source,QString FindStr);
		//позиция подстроки после заданной
		int str_index_of(QString Source,QString FindStr, int AfterPos=0 );

	  //СТРОКИ:обработка символов в строках
		QString str_trim(QString Source);
		QString str_to_lower(QString Source);
		QString str_to_upper(QString Source);
		QString str_replace_str(QString Source,QString Before, QString After);

	  //СТРОКИ:перекодирование (+2009.09.17)
		QString ByteArrayToString(QByteArray line, QString CodecName);
		QByteArray StringToByteArray(QString line, QString CodecName);

	  //БазовыеДИАЛОГИ:
		int get_last_inputdialog_key();
		QString inputdialog_get_text(QString Header,QString Question, QString InitialValue="");
		QString inputdialog_get_item(QString Header,QString Question, QString _ValueList);
		int messagebox(QString Text,QString InfoText, QString Detailes, int ButtonFlags);
		int msgbox_information(QString Title,QString Text, int ButtonFlags =1);
		int msgbox_question(QString Title,QString Text, int ButtonFlags);
		int msgbox_warning(QString Title,QString Text, int ButtonFlags =1);
		int msgbox_critical(QString Title,QString Text, int ButtonFlags);

                //2010.12.15 added
                QString inputdialog_openFile(const QString & caption = QString(),
                                             const QString & dir = QString(),
                                             const QString & filter = QString(),
                                             QString * selectedFilter = 0,
                                             QFileDialog::Options options = 0 );

                QString inputdialog_saveFile(const QString & caption = QString(),
                                             const QString & dir = QString(),
                                             const QString & filter = QString(),
                                             QString * selectedFilter = 0,
                                             QFileDialog::Options options = 0 );

		//bool waitForReadyRead_StdIn(int timeOut = 1000);
		//int error_StdIn();

	//	int setNotificationReadMode();//классика QT - отсылается сигнал что данные есть. Далее их надо читать.
	//	int setDataFlowReadMode();// данные отсылаются вместе с сигналами.

	  //-----------------------------------------------------------------------
		
		QString date_time(QString Format) {return QDateTime::currentDateTime().toString(Format);}
                QString date_time_fullStamp() {return QDateTime::currentDateTime().toString("yyyy.MM.dd_hh:mm:ss.zzz");}
                QString date_time_simpleStamp() {return QDateTime::currentDateTime().toString("yyyy.MM.dd_hhmm");}
                // TODO QERRORMessage

		// TODO QProgressDialog
		bool isGuiUsed(); //2009.09.08++
		QStringList getScriptArguments();//2009.09.08++
		QString getPlatformVersion();//2009.09.08++

                //простые кнструкции для хранения лога
                // debugLevel - подробность сообщения. для фильтрации и прочих нужд.
                bool addLogMessage(QString logMessage, int debugLevel=4);//2009.09.15++
                QString getLogAsText(int maxDebugLevel=4);//2011.05.15++
                QString clearLog();//2011.05.15++

		//void readyRead_StdIn_rsv();

    signals:
	//это осведомители - по направлению к объъектам системы, один по направлению к "ядру"
/**/	//void send_to_std_err(QByteArray Message); //--> подключен к SLOT QDroid.send_StdErr
/**/	//void send_to_std_out(QByteArray Message); //--> подключен к SLOT QDroid.send_StdOut
/*X*/	//void send_from_std_in(QByteArray Message);// -> к нему подключен SIGNAL QDroid.received_StdIn
	//void send_openStdReader();// -> запустить обработку потоков ввода
	//void send_closeStdReader();// -> остановить обработку потоков ввода-вывода
	//void sig_stdInStream_Closed();// информируем что мы узнали о том, что входной поток закрыт.
	//void changedCashMode(bool stdInCashMode);
	//void stdIn_readyRead();
	//void stdIn_CashOverflow();

    private:
    	QMessageBox::StandardButton LastInputDialogResult; //что было нажато в результате последнего окна диалога - OK Cancel или др.
    	QMessageBox::StandardButtons get_std_buttons( int BitFl);//
	t_FunctionRegistryItem *FunctionRegItem;//tmp!

        QStringList logMessages_text;
        QStringList logMessages_time;
        QList<int> logMessages_dbgLevel;
        //ещё бы уровень вложенности сделать... ? что бы можно было "трейсить"?...

};
Q_DECLARE_METATYPE(t_BaseBot*);

#endif /* T_BASEBOT_H_ */
